package com.atguigu.gmall.controller;

import com.alipay.api.internal.util.AlipaySignature;
import com.atguigu.gmall.config.AlipayConfig;
import com.atguigu.gmall.entity.PaymentInfo;
import com.atguigu.gmall.enums.PaymentStatus;
import com.atguigu.gmall.enums.PaymentType;
import com.atguigu.gmall.result.RetVal;
import com.atguigu.gmall.service.PaymentInfoService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/payment")
public class PaymentController {

    @Autowired
    private PaymentInfoService paymentInfoService;

    //点击支付宝支付之后，返回支付二维码页面信息，是支付宝提供的
    @RequestMapping("/createQrCode/{orderId}")
    public String createQrCode(@PathVariable Long orderId) throws Exception {
        return paymentInfoService.createQrCode(orderId);
    }

    //2.完成异步回调(用户支付之后，或支付超时，支付宝会回来调用此方法)
    @PostMapping("/async/notify")
    public String asyncNotify(@RequestParam Map<String, String> paramMap) throws Exception {
        //验证签名
        boolean rsaCheckV1 = AlipaySignature.rsaCheckV1(paramMap, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
        String tradeStatus = paramMap.get("trade_status");
        String outTradeNo = paramMap.get("out_trade_no");
        if (rsaCheckV1){ //签名成功，交易成功或者完成才能更改支付订单信息
            //交易成功或者完成才能更改支付订单信息
            if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)){
                //支付宝显示支付成功,获取支付订单信息，检测支付状态
                PaymentInfo paymentInfo =  paymentInfoService.getPaymentInfo(outTradeNo, PaymentType.ALIPAY.name());
                //如果交易已经关闭或者已经支付 防止支付宝异步重复调用时继续操作
                if (paymentInfo.getPaymentStatus().equals(PaymentStatus.PAID.name()) ||
                        paymentInfo.getPaymentStatus().equals(PaymentStatus.ClOSED.name())){
                    return "failure";
                }
                //否则，更新支付状态
                paymentInfoService.updatePaymentInfo(outTradeNo, PaymentType.ALIPAY.name(), paramMap);
                return "success";
            }else {
                //TODO 验签失败则记录异常日志，并在response中返回failure.
                return "failure";
            }
        }
        return "failure";
    }

    /*当交易发生之后一段时间内，由于业务原因（如金额错误，用户退款或者对账不平等等）
    需要退款时，商家可以调用 alipay.trade.refund(统一收单交易退款接口)
    通过商户网站唯一订单号 out_trade_no 或支付宝交易号 trade_no，将对应订单支付款退还给买家，
    支付宝将在收到退款请求并且验证成功之后，按照退款规则将支付款按原路退到买家帐号上。
    支持全额或部分退款。*/
    @RequestMapping("/refund/{orderId}")
    public RetVal refund(@PathVariable Long orderId) throws Exception{
        boolean flag = paymentInfoService.refund(orderId);
        return RetVal.ok(flag);
    }
    //4.关闭交易接口 http://127.0.0.1:8005/payment/closeAlipayTrade/28
    @GetMapping("/closeAlipayTrade/{orderId}")
    public boolean closeAlipayTrade(@PathVariable Long orderId) throws Exception{
        return paymentInfoService.closeAlipayTrade(orderId);
    }

    @GetMapping("getPaymentInfo/{outTradeNo}")
    public PaymentInfo getPaymentInfo(@PathVariable String outTradeNo){
        QueryWrapper<PaymentInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("out_trade_no", outTradeNo);
        return paymentInfoService.getOne(queryWrapper);
    }
    //5.查询阿里内部订单信息 http://127.0.0.1:8005/payment/queryAlipayTrade/28
    @GetMapping("/queryAlipayTrade/{orderId}")
    public boolean queryAlipayTrade(@PathVariable Long orderId) throws Exception{
        return paymentInfoService.queryAlipayTrade(orderId);
    }

}
